package com.ruoyi.student_club.service.impl;

import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.student_club.domain.User;
import com.ruoyi.student_club.dto.UpdateUserDto;
import com.ruoyi.student_club.dto.UserDto;
import com.ruoyi.student_club.mapper.UserMapper;
import com.ruoyi.student_club.service.IUserService;
import com.ruoyi.student_club.utils.GetOpenIdUtil;
import com.ruoyi.student_club.utils.SexUtil;
import com.ruoyi.student_club.vo.UserVo;
import com.ruoyi.student_club.vo.app.UserInfoVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.IOException;
import java.rmi.server.ExportException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 用户管理Service业务层处理
 * 
 * @author 无尤
 * @date 2022-01-14
 */
@Service
public class UserServiceImpl implements IUserService 
{
    @Resource
    private UserMapper userMapper;

    /**
     * 查询用户管理
     * 
     * @param userId 用户管理主键
     * @return 用户管理
     */
    @Override
    public User selectUserByUserId(Long userId)
    {
        return userMapper.selectUserByUserId(userId);
    }

    /**
     * 查询用户管理列表
     * 
     * @param user 用户管理
     * @return 用户管理
     */
    @Override
    public List<UserVo> selectUserList(User user)
    {
        List<User> list = userMapper.selectUserList(user);
        List<UserVo> voList = new ArrayList<>();
        for (User select : list) {
            String sex = SexUtil.getSex(select);
            UserVo userVo = new UserVo();
            userVo.setGender(sex);
            BeanUtils.copyProperties(select,userVo);
            voList.add(userVo);
        }
        return voList;

    }

    /**
     * 新增用户管理
     * 
     * @param user 用户管理
     * @return 结果
     */
    @Override
    public int insertUser(User user)
    {
        user.setCreateTime(DateUtils.getNowDate());
        return userMapper.insertUser(user);
    }

    /**
     * 修改用户管理
     * 
     * @param user 用户管理
     * @return 结果
     */
    @Override
    public int updateUser(User user)
    {
        user.setUpdateTime(DateUtils.getNowDate());
        return userMapper.updateUser(user);
    }

    /**
     * 批量删除用户管理
     * 
     * @param userIds 需要删除的用户管理主键
     * @return 结果
     */
    @Override
    public int deleteUserByUserIds(String userIds)
    {
        return userMapper.deleteUserByUserIds(Convert.toStrArray(userIds));
    }

    /**
     * 删除用户管理信息
     * 
     * @param userId 用户管理主键
     * @return 结果
     */
    @Override
    public int deleteUserByUserId(Long userId)
    {
        return userMapper.deleteUserByUserId(userId);
    }

    /**
     * 保存用户唯一标识
     * @param code 用户唯一标识
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public UserInfoVo saveOpenId(String code) throws IOException {
        if (code == null){
            throw new RuntimeException("授权码为空（code）");
        }
        String openId = GetOpenIdUtil.getOpenId(code);
        if (openId == null){
            throw new RuntimeException("请先登录");
        }
        //检查openId是否已经存在
        User checkUser = userMapper.getUserByOpenId(openId);
        UserInfoVo userInfoVo = new UserInfoVo();
        if (checkUser == null){
            User user = new User();
            user.setOpenid(openId);
            user.setCreateTime(new Date());
            user.setUpdateTime(new Date());
            userMapper.saveOpenId(user);
            //返回的参数
            userInfoVo.setOpenId(openId);
            userInfoVo.setUserId(user.getUserId());
            return userInfoVo;
        }else {
            userInfoVo.setUserId(checkUser.getUserId());
            userInfoVo.setOpenId(checkUser.getOpenid());
        }
        return userInfoVo;

    }

    /**
     * 保存用户头像和昵称
     * @param dto 用户信息对象
     */
    @Override
    public void updateUserInfo(UserDto dto){
        userMapper.updateUserInfo(dto);
    }

    /**
     * 获取用户资料
     * @param openId 用户唯一标识
     * @return
     */
    @Override
    public User getUserInfo(String openId){
        return userMapper.getUserByOpenId(openId);
    }

    /**
     * 更新用户资料
     * @param dto
     */
    @Override
    public void updateUserInfo(UpdateUserDto dto){
        userMapper.update(dto);
    }
}
